 /*******************************************************************************
  * Copyright (c) 2007 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - initial API and implementation
  ******************************************************************************/

 package org.eclipse.ui.internal.tweaklets;

 import org.eclipse.jface.dialogs.IDialogConstants;
 import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.jface.dialogs.ProgressMonitorDialog;
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.ui.IEditorInput;
 import org.eclipse.ui.IEditorPart;
 import org.eclipse.ui.IEditorReference;
 import org.eclipse.ui.IReusableEditor;
 import org.eclipse.ui.internal.EditorAreaHelper;
 import org.eclipse.ui.internal.EditorManager;
 import org.eclipse.ui.internal.EditorReference;
 import org.eclipse.ui.internal.EditorSite;
 import org.eclipse.ui.internal.IPreferenceConstants;
 import org.eclipse.ui.internal.Workbench;
 import org.eclipse.ui.internal.WorkbenchMessages;
 import org.eclipse.ui.internal.WorkbenchPage;
 import org.eclipse.ui.internal.WorkbenchPlugin;
 import org.eclipse.ui.internal.progress.ProgressMonitorJobsDialog;
 import org.eclipse.ui.internal.registry.EditorDescriptor;

 /**
  * @since 3.3
  *
  */
 public class TabBehaviourMRU extends TabBehaviour {

     public boolean alwaysShowPinAction() {
         return false;
     }

     public IEditorReference findReusableEditor(WorkbenchPage page) {
         boolean reuse = WorkbenchPlugin.getDefault().getPreferenceStore()
                 .getBoolean(IPreferenceConstants.REUSE_EDITORS_BOOLEAN);
         if (!reuse) {
             return null;
         }

         IEditorReference editors[] = page.getSortedEditors();
         if (editors.length < page.getEditorReuseThreshold()) {
             return null;
         }

         IEditorReference dirtyEditor = null;

         // Find a editor to be reused
 for (int i = 0; i < editors.length; i++) {
             IEditorReference editor = editors[i];
             // if(editor == activePart)
 // continue;
 if (editor.isPinned()) {
                 continue;
             }
             if (editor.isDirty()) {
                 if (dirtyEditor == null) {
                     dirtyEditor = editor;
                 }
                 continue;
             }
             return editor;
         }
         if (dirtyEditor == null) {
             return null;
         }

         /* fix for 11122 */
         boolean reuseDirty = WorkbenchPlugin.getDefault().getPreferenceStore()
                 .getBoolean(IPreferenceConstants.REUSE_DIRTY_EDITORS);
         if (!reuseDirty) {
             return null;
         }

         MessageDialog dialog = new MessageDialog(page.getWorkbenchWindow()
                 .getShell(),
                 WorkbenchMessages.EditorManager_reuseEditorDialogTitle,
                 null, // accept the default window icon
 NLS.bind(WorkbenchMessages.EditorManager_saveChangesQuestion,
                         dirtyEditor.getName()), MessageDialog.QUESTION,
                 new String [] { IDialogConstants.YES_LABEL,
                         IDialogConstants.NO_LABEL,
                         WorkbenchMessages.EditorManager_openNewEditorLabel }, 0);
         int result = dialog.open();
         if (result == 0) { // YES
 ProgressMonitorDialog pmd = new ProgressMonitorJobsDialog(dialog
                     .getShell());
             pmd.open();
             dirtyEditor.getEditor(true).doSave(pmd.getProgressMonitor());
             pmd.close();
         } else if ((result == 2) || (result == -1)) {
             return null;
         }
         return dirtyEditor;
     }

     public IEditorReference reuseInternalEditor(WorkbenchPage page,
             EditorManager manager, EditorAreaHelper editorPresentation,
             EditorDescriptor desc, IEditorInput input,
             IEditorReference reusableEditorRef) {
         IEditorPart reusableEditor = reusableEditorRef.getEditor(false);
         if (reusableEditor == null) {
             IEditorReference result = new EditorReference(manager, input, desc);
             page.closeEditor(reusableEditorRef, false);
             return result;
         }

         EditorSite site = (EditorSite) reusableEditor.getEditorSite();
         EditorDescriptor oldDesc = site.getEditorDescriptor();
         if ((desc.getId().equals(oldDesc.getId()))
                 && (reusableEditor instanceof IReusableEditor)) {
             Workbench wb = (Workbench) page.getWorkbenchWindow().getWorkbench();
             editorPresentation.moveEditor(reusableEditor, -1);
             wb.getEditorHistory().add(reusableEditor.getEditorInput(),
                     site.getEditorDescriptor());
             page.reuseEditor((IReusableEditor) reusableEditor, input);
             return reusableEditorRef;
         }
         // findReusableEditor(...) checks pinned and saves editor if
 // necessary, so it's OK to close "reusableEditor"
 IEditorReference ref = new EditorReference(manager, input, desc);
         reusableEditor.getEditorSite().getPage().closeEditor(reusableEditor,
                 false);
         return ref;
     }

 }

